package com.sunny.thread.synchronizedpack; /**
 * Created by Sunny on 2016/11/16.
 */

/**
 * main方法
 *
 * @author sunc
 * @date 2016-11-16-9:59
 */
public class EntranceClass {
    public static void main(String[] args) {

    /*  HasSelfPrivateNum privateNum = new HasSelfPrivateNum();
        ThreadA threadA = new ThreadA(privateNum);
        ThreadB threadB = new ThreadB(privateNum);
        threadA.start();
        threadB.start();*/
        /**
         * 多个线程运行同一个对象的同一个方法（synchronized）
         * 运行结果
         * a set over
         a ,num=100
         b set over
         b ,num=200
         --同步运行
         */

/*        HasSelfPrivateNum privateNuma = new HasSelfPrivateNum();
        HasSelfPrivateNum privateNumb = new HasSelfPrivateNum();
        ThreadA threadAa = new ThreadA(privateNuma);
        ThreadB threadBb = new ThreadB(privateNumb);
        threadAa.start();
        threadBb.start();*/
        /**
         多个线程运行多个对象的同一个方法（synchronized）
         a set over
         b set over
         b ,num=200
         a ,num=100
         --异步运行
         */
        /**
         * 结论：
         * synchronized 是针对对象加锁，并非针对某一个方法加锁，哪个线程先执行 synchronized方法，就持有该方法所属对象的锁
         * ，如果还有其他线程需要执行该对象的synchronized方法，那么那个其他线程需要排队。
         */

        HasSelfPrivateNum2 num2 = new HasSelfPrivateNum2("a");
        ThreadA2 threadA2 = new ThreadA2(num2);
        ThreadB2 threadB2 = new ThreadB2(num2);
        threadA2.start();
        threadB2.start();
        /**
         minusI是非同步方法
         Thread-0a set over
         Thread-1minus a set over
         Thread-0,name=a ,num=10
         Thread-1,name=a ,num=10
         结论：minusI方法可以和addI同步执行， Synchronized 方法 和 同一对象的非Synchronized方法可以同步执行。
         */

        /**
         * 在HasSelfPrivateNum2中，将minusI方法新增synchronized关键字，运行结果
         Thread-0a set over
         Thread-0,name=a ,num=100
         Thread-1minus a set over
         Thread-1,name=a ,num=10

         结论：minusI方法和 addI 异步执行， Synchronized 方法 和 同一对象的 Synchronized方法只能排队执行
         */
    }
}
